package utils;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 计算工作日的工具类
 * 普通工作日（周一到周五）、普通周末（周六和周日）、调休（普通工作日不上班）、加班（普通周末上班）
 */
public class WorkDateUtils {


    private static Date jzrq(List<Date> jbList,List<Date> txList,int gzrts, int curGzrts, Date curDate){
        if(ifWorkDate(curDate,jbList,txList)){
            curGzrts =curGzrts+1;
        }
        if (curGzrts<=gzrts){
            curDate = DateUtil.offsetDay(curDate, 1);
            return jzrq(jbList, txList,gzrts,curGzrts,curDate);
        }else{
            return curDate;
        }

    }

    private static boolean ifWorkDate(Date curDate,List<Date> jbList,List<Date> txList) {
        //如果当天是周六和周日 并且当天是加班，则是工作日
        //如果当天是周一到周五 并且当天不是调休，则非工作日
        DateTime curDateTime = new DateTime(curDate);
        if (curDateTime.isWeekend()){
            for (Date jbDate:jbList){
                long betweenDay = DateUtil.between(curDate, jbDate, DateUnit.DAY);
                if (betweenDay==0){
                    return true;
                }
            }
            return false;
        }else {
            for (Date txDate:txList){
                long betweenDay = DateUtil.between(curDate, txDate, DateUnit.DAY);
                if (betweenDay==0){
                    return false;
                }
            }
            return true;
        }
    }

    /**

     * 获取截止日期
     * @param startDate 开始日期
     * @param gzrts 工作日天数
     * @param jbList 加班列表
     * @param txList 调休列表
     * @return
     */
    public static Date getJzrq(Date startDate,int gzrts,List<Date> jbList,List<Date> txList){
        int curGzrts=0;
        Date curDate = new Date();
        curDate =jzrq(jbList,txList,gzrts,curGzrts,startDate);
        return curDate;
    }

    /**
     * 计算工作日
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param jbList 加班日期List
     * @param txList 调休日期List
     * @return
     */
    public static int calLeaveDays(Date startTime, Date endTime, List<Date> jbList,List<Date> txList) {
        int leaveDays = 0;
        //从startTime开始循环，若该日期不是节假日或者不是周六日，或者在补班内则天数+1
        Date flag = startTime;//设置循环开始日期
        Calendar cal = Calendar.getInstance();
        //循环遍历每个日期
        while (flag.compareTo(endTime) < 0) {
            cal.setTime(flag);
            //判断是否在补班内，如果在补班内，则+1
            if (!isExist(flag, jbList)) {
                //判断是否为周六日
                int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
                if (week == 0 || week == 6) {//0为周日，6为周六
                    //跳出循环进入下一个日期
                    cal.add(Calendar.DAY_OF_MONTH, +1);
                    flag = cal.getTime();
                    continue;
                }
                //判断是否为节假日
                try {
                    if (isExist(flag, txList)) {
                        //跳出循环进入下一个日期
                        cal.add(Calendar.DAY_OF_MONTH, +1);
                        flag = cal.getTime();
                        continue;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //不是节假日或者周末，或者在调休中，天数+1
            leaveDays = leaveDays + 1;
            //日期往后加一天
            cal.add(Calendar.DAY_OF_MONTH, +1);
            flag = cal.getTime();
        }
        return leaveDays;
    }

    /**
     * 判断当前日期，是否在调休、加班日期列表中
     * @param date 当前日期
     * @param list 加班、调休日期
     * @return
     */
    public static boolean isExist(Date date, List<Date> list) {
/*        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String time = simpleDateFormat.format(date.getTime());*/
        for (Date s : list) {
            if (DateConversionUtils.DateToStringYYYYMMDD(s).equalsIgnoreCase(DateConversionUtils.DateToStringYYYYMMDD(date))) {
                return true;
            }
        }
        return false;
    }


    /**
     * 验证当前日期是否存在日期列表中
     * @param date
     * @param list
     * @return true: 存在
     */
    public static boolean isExists(Date date, List<Date> list) {
        if (CollectionUtil.isEmpty(list)){
            return false;
        }
        for (Date s : list) {
            if (DateConversionUtils.DateToStringYYYYMMDD(s).equalsIgnoreCase(DateConversionUtils.DateToStringYYYYMMDD(date))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 当前日期是否为周末
     * @param date
     * @return false: 周末
     */
    public static boolean getWeekOfDate(Date date) {
        boolean[] weekDays = { false, true, true, true, true, true, false };
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];
    }

}
